package main

import (
	"context"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"

	"github.com/gin-gonic/gin"
)

//优雅关停，就是执行完超时前所有任务，然后再关闭服务器
//自己定义一个server  server.ListenAndServe是不堵塞的，会监听关闭信号，需要通过os.Signal来阻塞，
//设点超时5秒钟，然后拒绝这段时间发来的请求，但是会在这段超时时间之内的执行完之前的请求
func main() {
	r := gin.Default()
	r.GET("/test", func(c *gin.Context) {
		time.Sleep(10 * time.Second)
		c.String(200, "test ok")
	})
	server := &http.Server{
		Addr:    ":8081",
		Handler: r,
	}
	go func() {
		if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("Listen:%s\n", err)
		}
	}()
	quit := make(chan os.Signal, 2)
	//os.Signal 信号退出的捕获SIGINT,SIGTERM
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit
	log.Println("shutdowm server ... ...")

	//创建一个超时的上下文
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) //设置一个超时上下文来处理当服务器关闭时，能有时间处理完关闭前的请求
	defer cancel()
	//server根据超时上下文来关闭服务器
	if err := server.Shutdown(ctx); err != nil {
		log.Fatal("server shutdown err :", err)
	}

	log.Println("server exiting...")
}
